package com.condominio.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import com.condominio.excepcion.DAOExcepcion;
import com.condominio.modelo.Queja;
import com.condominio.modelo.Residente;
import com.condominio.util.ConexionBD;

public class QuejaDAO extends BaseDAO {

	public int insertQueja(Queja oQueja) throws DAOExcepcion {
		int i = 0;
		System.out.println("QuejaDAO: insertQueja(Queja oQueja)");
		String query = "INSERT INTO Queja( FeQueja, TxMotivo, FlEstado, " +
				"TxObservacion, CoResidente) VALUES (?,?,?,?,?)";
//		String query = "INSERT INTO Queja( FeQueja, TxMotivo, FlEstado, " +
//		"TxObservacion, CoResidente, CoAdministrador ) VALUES (?,?,?,?,?,?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setTimestamp(1, oQueja.getFechaQueja());
			stmt.setString(2, oQueja.getMotivo());
			stmt.setString(3, "0");
			stmt.setString(4, "");
			stmt.setInt(5, oQueja.getResidente().getCodigo());
//			stmt.setInt(6, 1);
//			stmt.setInt(6, oQueja.getAdministrador().getCodigo());
			System.out.println(stmt);
			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException();
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}	

	public Collection<Queja> listQueja() throws DAOExcepcion {
		System.out.println("QuejaDAO: listQueja()");
		//String query = "SELECT Queja.* from Queja";
		String query = "SELECT Queja.*, Residente.NoResidente as nresidente, Residente.noApepaterno , Residente.noApematerno from Queja,Residente where Queja.CoResidente=Residente.CoResidente";
		
		Collection<Queja> oQuejas = new ArrayList<Queja>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja oQueja = new Queja();
				oQueja.setFechaQueja(rs.getTimestamp("FeQueja"));
				oQueja.setMotivo(rs.getString("TxMotivo"));
				oQueja.setEstado(rs.getString("FlEstado"));
				oQueja.setObservacion(rs.getString("TxObservacion"));
				oQueja.setNombreResidente(rs.getString("nresidente") + ' ' + rs.getString("noApepaterno") + ' ' + rs.getString("noApematerno"));
				oQueja.setCodigo(rs.getInt("CoQueja"));
				oQuejas.add(oQueja);
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oQuejas;
	}

	public int updateQueja(Queja oQueja) throws DAOExcepcion {
		int i = 0;
		System.out.println("updateQueja(Queja oQueja)");
		String query = "UPDATE Queja SET FlEstado =  ?, TxObservacion = ? " + 
						" WHERE CoQueja = ?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {			
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, oQueja.getEstado());
			stmt.setString(2, oQueja.getObservacion());
			stmt.setInt(3, oQueja.getCodigo());

			i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException();
			}
			System.out.println(oQueja.getCodigo());
		} catch (SQLException e) {
			System.out.println("error");
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return i;
	}
	
	public Collection<Queja> listarQuejaResidente(int coResidente) throws DAOExcepcion {
		System.out.println("QuejaDAO: listarQuejaResidente(int coResidente)");
		Collection<Queja> lista = new ArrayList<Queja>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.getConexion();
			String query = "SELECT FeQueja, FlEstado, txObservacion from Queja where coResidente=?";
			stmt = con.prepareStatement(query);
			stmt.setInt(1, coResidente);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja oQueja = new Queja();
				oQueja.setFechaQueja(rs.getTimestamp("FeQueja"));
				oQueja.setEstado(rs.getString("FlEstado"));
				oQueja.setObservacion(rs.getString("txObservacion"));
				lista.add(oQueja);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Queja> listarQuejaEstado(String flEstado) throws DAOExcepcion {
		System.out.println("QuejaDAO: listarQuejaEstado(String flEstado");
		Collection<Queja> lista = new ArrayList<Queja>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.getConexion();
			String query = "SELECT FeQueja, TxMotivo, FlEstado, txObservacion from Queja where FlEstado=?";
			stmt = con.prepareStatement(query);
			stmt.setString(1, flEstado);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja oQueja = new Queja();
				oQueja.setFechaQueja(rs.getTimestamp("FeQueja"));
				oQueja.setEstado(rs.getString("FlEstado"));
				oQueja.setObservacion(rs.getString("txObservacion"));
				oQueja.setMotivo(rs.getString("TxMotivo"));
				lista.add(oQueja);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	public Collection<Queja> listQueja(String flEstado, int coResidente) throws DAOExcepcion {
		System.out.println("QuejaDAO: listQueja()");
		//String query = "SELECT Queja.* from Queja";
		String query = "SELECT * from Queja ";
		
		if(flEstado.equals("1000") && coResidente!=1000)
			query= query + " where coResidente=? ";
		else if(flEstado!="1000" && coResidente==1000)
			query= query + " where flEstado=?";
		else
			query= query + " where flEstado=? and coResidente=? ";
			
		
		Collection<Queja> lista = new ArrayList<Queja>();
		
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		ResidenteDAO daoResidente=new ResidenteDAO();
		try {
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			if(flEstado.equals("1000") && coResidente!=1000)
				stmt.setInt(1, coResidente);
			else if(flEstado!="1000" && coResidente==1000)
				stmt.setString(1, flEstado);
			else
				{
				stmt.setString(1, flEstado);
				stmt.setInt(2, coResidente);
				}
			
			
			rs = stmt.executeQuery();
			while (rs.next()) {
				Queja oQueja = new Queja();
				Residente oResidente=daoResidente.findCoResidente(rs.getInt("CoResidente"));
				oQueja.setFechaQueja(rs.getTimestamp("FeQueja"));
				oQueja.setMotivo(rs.getString("TxMotivo"));
				oQueja.setEstado(rs.getString("FlEstado"));
				oQueja.setObservacion(rs.getString("TxObservacion"));
				oQueja.setResidente(oResidente);
				oQueja.setNombreResidente(oResidente.getNombre() + " " + oResidente.getApellidoPaterno() + " " + oResidente.getApellidoMaterno());

				oQueja.setCodigo(rs.getInt("CoQueja"));
				lista.add(oQueja);
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}
	
	
	public Queja obtenerQueja(int coQueja) throws DAOExcepcion {
		System.out.println("QuejaDAO: listQueja()");
		//String query = "SELECT Queja.* from Queja";
		String query = "SELECT * from Queja where coQueja=?";
		Queja oQueja = new Queja();
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		ResidenteDAO daoResidente=new ResidenteDAO();
		try {
			con = ConexionBD.getConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, coQueja);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Residente oResidente=daoResidente.findCoResidente(rs.getInt("CoResidente"));
				oQueja.setFechaQueja(rs.getTimestamp("FeQueja"));
				oQueja.setMotivo(rs.getString("TxMotivo"));
				oQueja.setEstado(rs.getString("FlEstado"));
				oQueja.setObservacion(rs.getString("TxObservacion"));
				oQueja.setResidente(oResidente);
				oQueja.setCodigo(rs.getInt("CoQueja"));
			}
		} catch (SQLException e) {
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return oQueja;
	}
	
	
}